perm filename OLDPUP[AP,DBL] blob sn#070114 filedate 1973-11-07 generic text, type T, neo UTF8
(FILECREATED "21-OCT-73 21:58:49" PUP2)


(DEFINEQ

(AD
  [LAMBDA (L)
    (SETQ PUP2FNS (SORT (APPEND PUP2FNS L)))
    (SETQ PUP2FNS (INTERSECTION PUP2FNS PUP2FNS))
    (MAKEFILE (QUOTE PUP2])

(ASK:FOR:1
  [LAMBDA (CORRECT:CLASS:NAME)
    (SET CORRECT:CLASS:NAME (READ))
    (SETQ CORRECT:CLASS:NAME (EVAL CORRECT:CLASS:NAME))
    (COND
      ([AND (NOT (MEMBER CORRECT:CLASS:NAME 
                         LIST:OF:POSSIBLE:CLASS:NAMES))
            (AND (NOT (EQUAL CORRECT:CLASS:NAME (QUOTE NIL)))
                 (NOT (EQUAL CORRECT:CLASS:NAME (QUOTE NOTHING]
        (INSERT:1:LIST:OF:CLASS:NAMES CORRECT:CLASS:NAME))
      ((MEMBER CORRECT:CLASS:NAME LIST:OF:POSSIBLE:CLASS:NAMES)
        (RECONCILE:1 CORRECT:CLASS:NAME ELEMENT])

(ASK:FOR:2
  [LAMBDA (FILE:NAME)
    (PRINT (QUOTE (WHAT FILE NAME SHOULD I USE
                     IN CASE I DUMP OUT ALL MY KNOWLEDGE?)))
    (SETQ FILE:NAME (READ])

(CF
  [LAMBDA NIL
    (INITIALIZE:1)
    (PARTITION:A:DOMAIN])

(COMPARE:1
  [LAMBDA (POSSIBLE:CLASS:NAME ELEMENT)
    (PROGN (SETQ LIST:OF:OBJECTS:OF:POSSIBLE:CLASS (GETP 
                                                POSSIBLE:CLASS:NAME 
                                                      CLASS:OBJECTS))
           (COMPARE:1:1 LIST:OF:OBJECTS:OF:POSSIBLE:CLASS 
                        LIST:OF:OBJECTS:OF:ELEMENT)
           (COMPARE:1:2 SET:OF:RELATIONS:OF:POSSIBLE:CLASS 
                        POSSIBLE:CLASS:NAME])

(COMPARE:1:1
  [LAMBDA (LIST:OF:OBJECTS:OF:POSSIBLE:CLASS LIST:OF:OBJECTS:OF:ELEMENT)
    T])

(COMPARE:1:2
  [LAMBDA (SET:OF:RELATIONS:OF:POSSIBLE:CLASS SET:OF:RELATIONS 
                                              POSSIBLE:CLASS:NAME)
    (PROGN (SETQ SET:OF:YES:RELATIONS (GETP POSSIBLE:CLASS:NAME 
                                            YES:RELATIONS))
           (SETQ SET:OF:NO:RELATIONS (GETP POSSIBLE:CLASS:NAME 
                                           NO:RELATIONS))
           (SETQ SET:OF:MAYBE:RELATIONS (GETP POSSIBLE:CLASS:NAME 
                                              MAYBE:RELATIONS))
           (COMPARE:1:2:1 SET:OF:YES:RELATIONS SET:OF:RELATIONS)
           (COMPARE:1:2:2 SET:OF:NO:RELATIONS SET:OF:RELATIONS)
           (COMPARE:1:2:3 SET:OF:MAYBE:RELATIONS SET:OF:RELATIONS])

(COMPARE:1:2:1
  [LAMBDA (SET:OF:YES:RELATIONS SET:OF:RELATIONS)
    (FOREACH:1:2:1 (QUOTE YES:RELATION) IN SET:OF:YES:RELATIONS
       DO
       UNTIL (QUOTE (CONTRADICTS:1 YES:RELATION SET:OF:RELATIONS))
             (QUOTE (COMPARE:1:2:1:1 YES:RELATION SET:OF:RELATIONS])

(COMPARE:1:2:1:1
  [LAMBDA (MAYBE:RELATION SET:OF:RELATIONS)
    T])

(COMPARE:1:2:2
  [LAMBDA (SET:OF:NO:RELATIONS SET:OF:RELATIONS)
    (FOREACH:1:2:2 (QUOTE NO:RELATION) IN SET:OF:NO:RELATIONS
       DO
       UNTIL (QUOTE (CONTRADICTS:2 NO:RELATION SET:OF:RELATIONS))
             (QUOTE (COMPARE:1:2:2:1 NO:RELATION SET:OF:RELATIONS])

(COMPARE:1:2:2:1
  [LAMBDA (NO:RELATION SET:OF:RELATIONS)
    T])

(COMPARE:1:2:3
  [LAMBDA (SET:OF:MAYBE:RELATIONS SET:OF:RELATIONS)
    (FOREACH:1:2:3 (QUOTE MAYBE:RELATION) IN SET:OF:MAYBE:RELATIONS
       DO
       UNTIL (QUOTE (CONTRADICTS:3 MAYBE:RELATION SET:OF:RELATIONS))
             (QUOTE (COMPARE:1:2:3:1 MAYBE:RELATION SET:OF:RELATIONS])

(COMPARE:1:2:3:1
  [LAMBDA (MAYBE:RELATION SET:OF:RELATIONS)
    T])

(CONTRADICTS:1
  [LAMBDA (YES:RELATION SET:OF:RELATIONS)
    (NOT (MEMBER YES:RELATION SET:OF:RELATIONS])

(CONTRADICTS:2
  [LAMBDA (NO:RELATION SET:OF:RELATIONS)
    (MEMBER NO:RELATION SET:OF:RELATIONS])

(CONTRADICTS:3
  [LAMBDA (MAYBE:RELATION SET:OF:RELATIONS)
    NIL])

(CORRESPONDING:OBJECTS:PART
  [LAMBDA (ELEMENT)
    (CADR ELEMENT])

(CORRESPONDING:RELATIONS:PART
  [LAMBDA (ELEMENT)
    (CDDR ELEMENT])

(DELETE:1:1
  [LAMBDA (RELATION P:LIST)
    (PROG (TEMPORARY:MAYBE:RELATIONS)
          (SETQ TEMPORARY:MAYBE:RELATIONS (GETP CLASS:NAME 
                                                MAYBE:RELATIONS))
          (SETQ TEMPORARY:MAYBE:RELATIONS (PULLOUT RELATION 
                                          TEMPORARY:MAYBE:RELATIONS))
          (PUT CLASS:NAME MAYBE:RELATIONS TEMPORARY:MAYBE:RELATIONS])

(DETERMINE:1:CLASS:NAME
  [LAMBDA NIL
    (FOREACH:1 (QUOTE POSSIBLE:CLASS:NAME) IN 
                                       LIST:OF:POSSIBLE:CLASS:NAMES
       DO (QUOTE (TEST:1 POSSIBLE:CLASS:NAME)))
    (ASKFOR:1 (QUOTE CORRECT:CLASS:NAME))
    (COND
      ((NOT (EQUAL CLASS:NAME (QUOTE FAILURE)))
        (COND
          ([COND
              ([AND (NOT (EQUAL CLASS:NAME CORRECT:CLASS:NAME))
                    (NOT (NULL (SETDIFFERENCE SET:OF:MAYBE:RELATIONS 
                                              SET:OF:RELATIONS]
                (FORSOME:1 (QUOTE RELATION) IN (SETDIFFERENCE 
                                             SET:OF:MAYBE:RELATIONS 
                                                   SET:OF:RELATIONS)
                   DO (QUOTE (TRANSFER:1 RELATION FROM 
                                             SET:OF:MAYBE:RELATIONS
                                TO SET:OF:YES:RELATIONS]
            T)
          (T (COND
               ([AND (NOT (EQUAL CLASS:NAME CORRECT:CLASS:NAME))
                     (NOT (NULL (SETDIFFERENCE SET:OF:RELATIONS 
                                             SET:OF:MAYBE:RELATIONS]
                 (FORSOME:2 (QUOTE RELATION) IN (SETDIFFERENCE 
                                                   SET:OF:RELATIONS 
                                             SET:OF:MAYBE:RELATIONS)
                    DO (QUOTE (TRANSFER:2 RELATION FROM 
                                                   SET:OF:RELATIONS
                                 TO SET:OF:NO:RELATIONS])

(DISK:DUMP
  [LAMBDA (FILE STUFF)
    (SETQ FILEVARS (MKATOM (CONCAT (MKSTRING FILE)
                                   "VARS")))
    (SET FILEVARS (QUOTE STUFF))
    (MAKEFILE FILE])

(FOREACH
  [LAMBDA (X IN SET DO ACTION)
    (PROG (RESULT)
      START:HERE
          (COND
            ((NULL SET)
              (RETURN RESULT)))
          (SET X (CAR SET))
          (SETQ SET (CDR SET))
          (SETQ RESULT (EVAL ACTION))
          (GO START:HERE])

(FOREACH:1
  [LAMBDA (POSSIBLE:CLASS:NAME IN LIST:OF:POSSIBLE:CLASS:NAMES
             DO ACTION)
    [COND
      ((NULL LIST:OF:POSSIBLE:CLASS:NAMES)
        (PRINT (QUOTE (I DONT KNOW WHAT IT IS, WHAT IS IT?)))
        (RETURN (QUOTE FAILURE]
    (PROG (RESULT:1)
      LABEL:1
          (SET POSSIBLE:CLASS:NAME (CAR LIST:OF:POSSIBLE:CLASS:NAMES))
          (SETQ LIST:OF:POSSIBLE:CLASS:NAMES (CDR 
                                       LIST:OF:POSSIBLE:CLASS:NAMES))
          (SETQ RESULT:1 (EVAL ACTION))
          (COND
            ((NOT (NULL RESULT:1))
              (PRINT (QUOTE (I BELIEVE THIS IS A)))
              (PRINT POSSIBLE:CLASS:NAME)
              (PRINT (QUOTE (WHAT IS IT?)))
              (SETQ CLASS:NAME POSSIBLE:CLASS:NAME)
              (RETURN (EVAL POSSIBLE:CLASS:NAME)))
            (LIST:OF:POSSIBLE:CLASS:NAMES (GO LABEL:1))
            (T (RETURN (PRINT (QUOTE (I DONT KNOW WHAT IT IS, WHAT IS 
                                        IT?)))
                       (RETURN (QUOTE FAILURE])

(FOREACH:1:2:1
  [LAMBDA (YES:RELATION IN SET:OF:YES:RELATIONS DO UNTIL 
                                                    UNTIL:CONDITION 
                                                         ACTION)
    (COND
      ((NULL SET:OF:YES:RELATIONS)
        T))
    (PROG (RESULT:1:2:1)
      LABEL:1:2:1
          (SET YES:RELATION (CAR SET:OF:YES:RELATIONS))
          (SETQ SET:OF:YES:RELATIONS (CDR SET:OF:YES:RELATIONS))
          (SETQ RESULT:1:2:1 (EVAL ACTION))
          (COND
            ((EVAL UNTIL:CONDITION)
              (RETURN NIL))
            (SET:OF:YES:RELATIONS (GO LABEL:1:2:1))
            (T (RETURN RESULT:1:2:1])

(FOREACH:1:2:2
  [LAMBDA (NO:RELATION IN SET:OF:NO:RELATIONS DO UNTIL UNTIL:CONDITION 
                                                       ACTION)
    (COND
      ((NULL SET:OF:NO:RELATIONS)
        T))
    (PROG (RESULT:1:2:2)
      LABEL:1:2:2
          (SET NO:RELATION (CAR SET:OF:NO:RELATIONS))
          (SETQ SET:OF:NO:RELATIONS (CDR SET:OF:NO:RELATIONS))
          (SETQ RESULT:1:2:2 (EVAL ACTION))
          (COND
            ((EVAL UNTIL:CONDITION)
              (RETURN NIL))
            (SET:OF:NO:RELATIONS (GO LABEL:1:2:2))
            (T (RETURN RESULT:1:2:2])

(FOREACH:1:2:3
  [LAMBDA (MAYBE:RELATION IN SET:OF:MAYBE:RELATIONS DO UNTIL 
                                                    UNTIL:CONDITION 
                                                             ACTION)
    (COND
      ((NULL SET:OF:MAYBE:RELATIONS)
        T))
    (PROG (RESULT:1:2:3)
      LABEL:1:2:3
          (SET MAYBE:RELATION (CAR SET:OF:MAYBE:RELATIONS))
          (SETQ SET:OF:MAYBE:RELATIONS (CDR SET:OF:MAYBE:RELATIONS))
          (SETQ RESULT:1:2:3 (EVAL ACTION))
          (COND
            ((EVAL UNTIL:CONDITION)
              (RETURN NIL))
            (SET:OF:MAYBE:RELATIONS (GO LABEL:1:2:3))
            (T (RETURN RESULT:1:2:3])

(FORSOME:1
  [LAMBDA (RELATION IN SET:DIFF DO ACTION)
    (COND
      ((NULL SET:DIFF)
        NIL))
    (SET RELATION (CAR SET:DIFF))
    (EVAL ACTION)
    T])

(FORSOME:2
  [LAMBDA (RELATION IN SET:DIFF DO ACTION)
    (COND
      ((NULL SET:DIFF)
        NIL))
    (SET RELATION (CAR SET:DIFF))
    (EVAL ACTION)
    T])

(HALT:1
  [LAMBDA NIL
    (OUTPUT:1 LIST:OF:POSSIBLE:CLASS:NAMES)
    (COND
      ((EQUAL (ASK:FOR:2 (QUOTE SHOULD:I:CONTINUE:ON)
                         (QUOTE YES))
              (PARTITION:A:DOMAIN))
        (T NIL])

(HAS:NAME
  [LAMBDA (ELEMENT)
    (NOT (EQUAL (CAR ELEMENT)
                (QUOTE ?])

(INITIALIZE:1
  [LAMBDA NIL
    (SAVESETQ YES:RELATIONS (QUOTE YES:RELATIONS))
    (SAVESETQ NO:RELATIONS (QUOTE NO:RELATIONS))
    (SAVESETQ MAYBE:RELATIONS (QUOTE MAYBE:RELATIONS))
    (SAVESETQ CLASS:OBJECTS (QUOTE CLASS:OBJECTS))
    (SETQ CLASS:NAMES:ORDERING (QUOTE CLASS:NAMES:ORDERING))
    (SAVESETQ IN (QUOTE IN))
    (SAVESETQ UNTIL (QUOTE UNTIL))
    (SAVESETQ DO (QUOTE DO))
    (SAVESETQ FROM (QUOTE FROM))
    (SAVESETQ TO (QUOTE TO))
    (SETQ USING (QUOTE USING))
    (SAVESETQ LIST:OF:POSSIBLE:CLASS:NAMES NIL)
    (SAVESETQ FILE:NAME (ASK:FOR:2 (QUOTE FILE:NAME])

(INPUT:1:ELEMENT
  [LAMBDA NIL
    (PRINT (QUOTE (I AM READY FOR A SCENE)))
    (SETQ ELEMENT (READ))
    (SETQ LIST:OF:OBJECTS:OF:ELEMENT (CORRESPONDING:OBJECTS:PART 
                                                            ELEMENT))
    (SETQ SET:OF:RELATIONS (CORRESPONDING:RELATIONS:PART ELEMENT))
    (SETQ CLASS:NAME (CAR ELEMENT])

(INPUT:2:CLASS:NAME
  [LAMBDA NIL
    (SETQ CLASS:NAME CLASS:NAME)
    (COND
      ([AND (NOT (MEMBER CLASS:NAME LIST:OF:POSSIBLE:CLASS:NAMES))
            (AND (NOT (EQUAL CLASS:NAME (QUOTE NIL)))
                 (NOT (EQUAL CLASS:NAME (QUOTE NOTHING]
        (INSERT:2:LIST:OF:CLASS:NAMES CLASS:NAME))
      (COND
        ((MEMBER CLASS:NAME LIST:OF:POSSIBLE:CLASS:NAMES)
          (RECONCILE:1 ELEMENT CLASS:NAME])

(INSERT:1
  [LAMBDA (CORRECT:CLASS:NAME)
    (SETQ LIST:OF:POSSIBLE:CLASS:NAMES (MERGE:1 CORRECT:CLASS:NAME 
                                       LIST:OF:POSSIBLE:CLASS:NAMES 
                                               CLASS:NAMES:ORDERING))
    (PUT CORRECT:CLASS:NAME YES:RELATIONS NIL)
    (PUT CORRECT:CLASS:NAME NO:RELATIONS NIL)
    (PUT CORRECT:CLASS:NAME MAYBE:RELATIONS SET:OF:RELATIONS)
    (PUT CORRECT:CLASS:NAME CLASS:OBJECTS LIST:OF:OBJECTS:OF:ELEMENT])

(INSERT:1:1
  [LAMBDA (RELATION P:LIST)
    (PROG (TEMPORARY:YES:RELATIONS)
          (SETQ TEMPORARY:YES:RELATION (GETP CLASS:NAME YES:RELATIONS))
          (SETQ TEMPORARY:YES:RELATIONS (CONS RELATION 
                                            TEMPORARY:YES:RELATIONS))
          (PUT CLASS:NAME YES:RELATIONS TEMPORARY:YES:RELATIONS])

(INSERT:2
  [LAMBDA (CLASS:NAME)
    (SETQ LIST:OF:POSSIBLE:CLASS:NAMES (MERGE:1 CLASS:NAME 
                                       LIST:OF:POSSIBLE:CLASS:NAMES 
                                               CLASS:NAMES:ORDERING))
    (PUT CLASS:NAME YES:RELATIONS NIL)
    (PUT CLASS:NAME NO:RELATIONS NIL)
    (PUT CLASS:NAME MAYBE:RELATIONS SET:OF:RELATIONS)
    (PUT CLASS:NAME CLASS:OBJECTS LIST:OF:OBJECTS:OF:ELEMENT])

(INSERT:2:1
  [LAMBDA (RELATION P:LIST)
    (PROG (TEMPORARY:NO:RELATIONS)
          (SETQ TEMPORARY:NO:RELATION (GETP CLASS:NAME NO:RELATIONS))
          (SETQ TEMPORARY:NO:RELATIONS (CONS RELATION 
                                             TEMPORARY:NO:RELATIONS))
          (PUT CLASS:NAME NO:RELATIONS TEMPORARY:NO:RELATIONS])

(MERGE:1
  [LAMBDA (E L F)
    (COND
      ((OR (NULL L)
           (APPLY* F E (CAR L)))
        (CONS E L))
      (T (CONS (CAR L)
               (MERGE:1 E (CDR L)
                        F])

(OUTPUT:1
  [LAMBDA (LIST:OF:POSSIBLE:CLASS:NAMES)
    (FOREACH (QUOTE POSSIBLE:CLASS:NAME) IN 
                                       LIST:OF:POSSIBLE:CLASS:NAMES
       DO (QUOTE (DISK:DUMP FILE:NAME (LIST POSSIBLE:CLASS:NAME
                                            (GETP POSSIBLE:CLASS:NAME 
                                                  CLASS:OBJECTS)
                                            (GETP POSSIBLE:CLASS:NAME 
                                                  YES:RELATIONS)
                                            (GETP POSSIBLE:CLASS:NAME 
                                                  NO:RELATIONS)
                                            (GETP POSSIBLE:CLASS:NAME 
                                                  MAYBE:RELATIONS])

(PARTITION:A:DOMAIN
  [LAMBDA NIL
    (PROG NIL
      START:OF:SERIES
          (INPUT:1:ELEMENT)
          (COND
            ((HAS:NAME ELEMENT)
              (INPUT:2:CLASS:NAME))
            (T (DETERMINE:1:CLASS:NAME)))
          (COND
            ((EQUAL CLASS:NAME (QUOTE HALT))
              (HALT))
            (T (PRINT (QUOTE (I NOW KNOW)))
               [FOREACH (QUOTE NAME) IN LIST:OF:POSSIBLE:CLASS:NAMES
                  DO (QUOTE (PROGN (PRINT NAME)
                                   [COND
                                     ((GETP NAME CLASS:OBJECTS)
                                       (PRIN1 (QUOTE "OBJECTS "))
                                       (PRINT (GETP NAME CLASS:OBJECTS]
                                   [COND
                                     ((GETP NAME YES:RELATIONS)
                                       (PRIN1 (QUOTE "MUST HAVW "))
                                       (PRINT (GETP NAME YES:RELATIONS]
                                   [COND
                                     ((GETP NAME NO:RELATIONS)
                                       (PRIN1 (QUOTE "MUSNT HAVE "))
                                       (PRINT (GETP NAME NO:RELATIONS]
                                   (COND
                                     ((GETP NAME MAYBE:RELATIONS)
                                       (PRIN1 (QUOTE "MAY HAVE "))
                                       (PRINT (GETP NAME 
                                                    MAYBE:RELATIONS]
               (GO START:OF:SERIES])

(PULLOUT
  [LAMBDA (E L)
    (COND
      ((ATOM L)
        L)
      ((EQUAL E (CAR L))
        (CDR L))
      (T (CONS (CAR L)
               (PULLOUT E (CDR L])

(RECONCILE:1
  [LAMBDA (CLASS:NAME ELEMENT)
    (SETQ LIST:OF:OBJECTS:OF:CLASS (GETP CLASS:NAME CLASS:OBJECTS))
    (SETQ SET:OF:YES:RELATIONS (GETP CLASS:NAME YES:RELATIONS))
    (SETQ SET:OF:NO:RELATIONS (GETP CLASS:NAME NO:RELATIONS))
    (SETQ SET:OF:MAYBE:RELATIONS (GETP CLASS:NAME MAYBE:RELATIONS))
    (RECONCILE:1:1 LIST:OF:OBJECTS:OF:CLASS LIST:OF:OBJECTS:OF:ELEMENT 
                   CLASS:NAME)
    (RECONCILE:1:2 SET:OF:YES:RELATIONS SET:OF:RELATIONS CLASS:NAME)
    (RECONCILE:1:3 SET:OF:NO:RELATIONS SET:OF:RELATIONS CLASS:NAME)
    (RECONCILE:1:4 SET:OF:MAYBE:RELATIONS SET:OF:RELATIONS CLASS:NAME])

(RECONCILE:1:1
  [LAMBDA (LIST:OF:OBJECTS:OF:CLASS LIST:OF:OBJECTS:OF:ELEMENT 
                                    CLASS:NAME)
    (SETQ NEW:LIST:OF:OBJECTS:OF:CLASS (RENAME:1:1 
                                           LIST:OF:OBJECTS:OF:CLASS 
                                         LIST:OF:OBJECTS:OF:ELEMENT))
    (SETQ NEW:LIST:OF:OBJECTS:OF:ELEMENT (RENAME:1:2 
                                           LIST:OF:OBJECTS:OF:CLASS 
                                         LIST:OF:OBJECTS:OF:ELEMENT))
    (REWRITE:1 SET:OF:RELATIONS USING LIST:OF:OBJECTS:OF:ELEMENT 
               NEW:LIST:OF:OBJECTS:OF:ELEMENT CLASS:NAME)
    (REWRITE:2 SET:OF:YES:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
               NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME)
    (REWRITE:3 SET:OF:NO:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
               NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME)
    (REWRITE:4 SET:OF:MAYBE:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
               NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME)
    (REWRITE:5 LIST:OF:OBJECTS:OF:ELEMENT USING 
               NEW:LIST:OF:OBJECTS:OF:ELEMENT CLASS:NAME)
    (REWRITE:6 LIST:OF:OBJECTS:OF:CLASS USING 
               NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME])

(RECONCILE:1:2
  [LAMBDA (SET:OF:YES:RELATIONS SET:OF:RELATIONS CLASS:NAME)
    (FOREACH (QUOTE RELATION) IN (SETDIFFERENCE SET:OF:YES:RELATIONS 
                                                SET:OF:RELATIONS)
       DO (TRANSFER RELATION FROM SET:OF:YES:RELATIONS TO 
                                             SET:OF:MAYBE:RELATIONS])

(RECONCILE:1:3
  [LAMBDA (SET:OF:NO:RELATIONS SET:OF:RELATIONS CLASS:NAME)
    (FOREACH RELATION IN (SETINTERSECTION SET:OF:RELATIONS 
                                          SET:OF:NO:RELATIONS)
       DO (QUOTE (TRANSFER RELATION FROM SET:OF:NO:RELATIONS
                    TO SET:OF:MAYBE:RELATIONS])

(RECONCILE:1:4
  [LAMBDA (SET:OF:MAYBE:RELATIONS SET:OF:RELATIONS CLASS:NAME)
    (FOREACH (QUOTE RELATION) IN (SETDIFFERENCE SET:OF:RELATIONS
                                                (SETUNION 
                                               SET:OF:YES:RELATIONS 
                                                SET:OF:NO:RELATIONS 
                                             SET:OF:MAYBE:RELATIONS))
       DO (QUOTE (TRANSFER RELATION FROM SET:OF:RELATIONS TO 
                                             SET:OF:MAYBE:RELATIONS])

(RENAME:1:1
  [LAMBDA (L1 L2)
    (APPEND (COND
              [L1 [COND
                    (L2 (LIST (CAR L2)))
                    (T (LIST (CAR L1]
                  (T (COND
                       (L2 (LIST (CAR L2)))
                       (T NIL]
              (COND
                ((OR L1 L2)
                  (RENAME:1:1 (CDR L1)
                              (CDR L2)))
                (T NIL])

(RENAME:1:2
  [LAMBDA (L1 L2)
    (APPEND (COND
              ((AND L1 L2)
                (LIST (CAR L2)))
              (T L1))
            (COND
              ((AND L1 L2)
                (RENAME:1:2 (CDR L1)
                            (CDR L2)))
              (T NIL])

(REWRITE:1
  [LAMBDA (SET:OF:RELATIONS USING LIST:OF:OBJECTS:OF:ELEMENT 
                            NEW:LIST:OF:OBJECTS:OF:ELEMENT CLASS:NAME)
    (PROG (NEW:1 OLD:1)
      LABEL:1
          (COND
            ((NULL LIST:OF:OBJECTS:OF:ELEMENT)
              (RETURN SET:OF:RELATIONS))
            ((NULL NEW:LIST:OF:OBJECTS:OF:ELEMENT)
              (RETURN SET:OF:RELATIONS)))
          (SETQ NEW:1 (CAR NEW:LIST:OF:OBJECTS:OF:ELEMENT))
          (SETQ OLD:1 (CAR LIST:OF:OBJECTS:OF:ELEMENT))
          (SUBSTITUTE NEW:1 FOR OLD:1 IN SET:OF:RELATIONS)
          (GO LABEL:1])

(REWRITE:2
  [LAMBDA (SET:OF:YES:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
                                NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME)
    (PROG (OLD:2 NEW:2)
      LABEL:2
          (COND
            ((NULL LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME YES:RELATIONS SET:OF:YES:RELATIONS)
              (RETURN SET:OF:YES:RELATIONS))
            ((NULL NEW:LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME YES:RELATIONS SET:OF:YES:RELATIONS)
              (RETURN SET:OF:YES:RELATIONS)))
          (SETQ OLD:2 (CAR LIST:OF:OBJECTS:OF:CLASS))
          (SETQ NEW:2 (CAR NEW:LIST:OF:OBJECTS:OF:CLASS))
          (SUBSTITUTE NEW:2 FOR OLD:2 IN SET:OF:YES:RELATIONS)
          (GO LABEL:2])

(REWRITE:3
  [LAMBDA (SET:OF:NO:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
                               NEW:LIST:OF:OBJECTS:OF:CLASS CLASS:NAME)
    (PROG (OLD:3 NEW:3)
      LABEL:3
          (COND
            ((NULL LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME NO:RELATIONS SET:OF:NO:RELATIONS)
              (RETURN SET:OF:NO:RELATIONS))
            ((NULL NEW:LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME NO:RELATIONS SET:OF:NO:RELATIONS)
              (RETURN SET:OF:NO:RELATIONS)))
          (SETQ OLD:3 (CAR LIST:OF:OBJECTS:OF:CLASS))
          (SETQ NEW:3 (CAR NEW:LIST:OF:OBJECTS:OF:CLASS))
          (SUBSTITUTE NEW:3 FOR OLD:3 IN SET:OF:NO:RELATIONS)
          (GO LABEL:3])

(REWRITE:4
  [LAMBDA (SET:OF:MAYBE:RELATIONS USING LIST:OF:OBJECTS:OF:CLASS 
                                  NEW:LIST:OF:OBJECTS:OF:CLASS 
                                  CLASS:NAME)
    (PROG (OLD:4 NEW:4)
      LABEL:4
          (COND
            ((NULL LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME MAYBE:RELATIONS SET:OF:MAYBE:RELATIONS)
              (RETURN SET:OF:MAYBE:RELATIONS))
            ((NULL NEW:LIST:OF:OBJECTS:OF:CLASS)
              (PUT CLASS:NAME MAYBE:RELATIONS SET:OF:MAYBE:RELATIONS)
              (RETURN SET:OF:MAYBE:RELATIONS)))
          (SETQ OLD:4 (CAR LIST:OF:OBJECTS:OF:CLASS))
          (SETQ NEW:4 (CAR NEW:LIST:OF:OBJECTS:OF:CLASS))
          (SUBSTITUTE NEW:4 FOR OLD:4 IN SET:OF:MAYBE:RELATIONS)
          (GO LABEL:4])

(REWRITE:5
  [LAMBDA (LIST:OF:OBJECTS:OF:ELEMENT USING 
                                     NEW:LIST:OF:OBJECTS:OF:ELEMENT 
                                      CLASS:NAME)
    (SETQ LIST:OF:OBJECTS:OF:ELEMENT NEW:LIST:OF:OBJECTS:OF:ELEMENT])

(REWRITE:6
  [LAMBDA (LIST:OF:OBJECTS:OF:CLASS USING NEW:LIST:OF:OBJECTS:OF:CLASS 
                                    CLASS:NAME)
    (SETQ LIST:OF:OBJECTS:OF:CLASS NEW:LIST:OF:OBJECTS:OF:CLASS)
    (PUT CLASS:NAME CLASS:OBJECTS LIST:OF:OBJECTS:OF:CLASS])

(SETDIFFERENCE
  [LAMBDA (S1 S2)
    (COND
      ((NULL S1)
        NIL)
      (T (APPEND [COND
                   ((MEMBER (CAR S1)
                            S2)
                     NIL)
                   (T (LIST (CAR S1]
                 (SETDIFFERENCE (CDR S1)
                                S2])

(SETINTERSECTION
  [LAMBDA (S1 S2)
    (INTERSECTION S1 S2])

(SETUNION
  [LAMBDA (S1 S2)
    (SETQ S1 (APPEND S1 S2))
    (INTERSECTION S1 S1])

(SUBSTITUTE
  [LAMBDA (NEW FOR OLD IN SET)
    (SUBST NEW OLD SET])

(TEST:1
  [LAMBDA (POSSIBLE:CLASS:NAME)
    (COMPARE:1 POSSIBLE:CLASS:NAME ELEMENT])

(TRANSFER:1
  [LAMBDA (RELATION FROM SET:OF:MAYBE:RELATIONS TO SET:OF:YES:RELATIONS)
    (SETQ NEW:SET:OF:YES:RELATIONS (CONS RELATION SET:OF:YES:RELATIONS))
    (INSERT:1:1 RELATION (QUOTE (PROPERTY YES:RELATIONS
                                   ON PROPERTY:LIST OF CLASS:NAME)))
    (SETQ NEW:SET:OF:MAYBE:RELATIONS (PULLOUT RELATION 
                                             SET:OF:MAYBE:RELATIONS))
    (DELETE:1:1 RELATION (QUOTE (PROPERTY (MAYBE:RELATIONS
                                             ON PROPERTY:LIST OF 
                                                CLASS:NAME])

(TRANSFER:2
  [LAMBDA (RELATION FROM SET:OF:RELATIONS TO SET:OF:NO:RELATIONS)
    (SETQ NEW:SET:OF:NO:RELATIONS (CONS RELATION SET:OF:NO:RELATIONS))
    (INSERT:2:1 RELATION (QUOTE (PROPERTY NO:RELATIONS
                                   ON PROPERTY:LIST OF CLASS:NAME)))
    (SETQ NEW:SET:OF:RELATIONS (PULLOUT RELATION SET:OF:RELATIONS])
)
  (LISPXPRINT (QUOTE PUP2FNS)
              T)
  (RPAQQ PUP2FNS
         (AD ASK:FOR:1 ASK:FOR:2 CF COMPARE:1 COMPARE:1:1 COMPARE:1:2 
             COMPARE:1:2:1 COMPARE:1:2:1:1 COMPARE:1:2:2 
             COMPARE:1:2:2:1 COMPARE:1:2:3 COMPARE:1:2:3:1 
             CONTRADICTS:1 CONTRADICTS:2 CONTRADICTS:3 
             CORRESPONDING:OBJECTS:PART CORRESPONDING:RELATIONS:PART 
             DELETE:1:1 DETERMINE:1:CLASS:NAME DISK:DUMP FOREACH 
             FOREACH:1 FOREACH:1:2:1 FOREACH:1:2:2 FOREACH:1:2:3 
             FORSOME:1 FORSOME:2 HALT:1 HAS:NAME INITIALIZE:1 
             INPUT:1:ELEMENT INPUT:2:CLASS:NAME INSERT:1 INSERT:1:1 
             INSERT:2 INSERT:2:1 MERGE:1 OUTPUT:1 PARTITION:A:DOMAIN 
             PULLOUT RECONCILE:1 RECONCILE:1:1 RECONCILE:1:2 
             RECONCILE:1:3 RECONCILE:1:4 RENAME:1:1 RENAME:1:2 
             REWRITE:1 REWRITE:2 REWRITE:3 REWRITE:4 REWRITE:5 
             REWRITE:6 SETDIFFERENCE SETINTERSECTION SETUNION 
             SUBSTITUTE TEST:1 TRANSFER:1 TRANSFER:2))
STOP